#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define   N   32

typedef struct node
{ 
    int data[N] ;  // 用来存放数据的数组
    int index; //数组下标的索引  
}seqlist_t;

seqlist_t * create_empty_seqlist_head()
{
    seqlist_t * h = (seqlist_t * )malloc(sizeof(seqlist_t)) ; 
    h->index = -1; // 数组的下标从-1 开始
    memset(h->data,0,N); 
    return h; 
}
// 为空 为真 
// 不为空 为假
int seqlist_is_empty(seqlist_t * h)
{
    return  (h->index == -1) ; 
}

// 为空 为真 
// 不为空 为假
int seqlist_is_full(seqlist_t * h)
{
    return  (h->index >= N-1) ; 
}

int seqlist_insert(seqlist_t * h, int value)/*增加*/
{
    if(seqlist_is_full(h))
    {
        printf("顺序表已满\n"); 
        return  -1 ;
    }
    h->index ++ ; 
    h->data[h->index] = value; 
    return 0; 
}

int seqlist_delete(seqlist_t * h, int value)/*删除*/
{
    if(seqlist_is_empty(h))
    {
        printf("顺序表已空\n"); 
        return  -1 ;
    }
    for(int i=0;i<= h->index ;i++)
    {
        if(h->data[i] == value) // 找到要删除的元素
        {
            // 后面的所有元素往前移动一个位置
            for(int j=i;j<h->index;j++)
            {
                h->data[j] = h->data[j+1];  
            }
            h->index -- ; // 顺序表中的元素个数减1
            return 0 ; // 直接返回
        }
    }

    return 0; 
}

int seqlist_modify(seqlist_t * h,int old,int new)/*修改*/
{
    for(int i=0;i<= h->index ;i++)
    {
        if(h->data[i] == old) // 找到要删除的元素
        {

            h->data[i] = new; // 顺序表中的元素个数减1
            return 0 ; // 直接返回
        }
    }
}

int seqlist_search(seqlist_t *h,int value)/*查找*/
{
    for(int i=0;i<= h->index;i++)
    {
        if (h->data[i] == value) // 找到了
        {
            return 1; // 返回为真
        }
 
    }
      return 0; // 没有找到 返回假           
}

int seqlist_reverse(seqlist_t *h)/*逆序*/
{

    for(int i=0,q=0;i< (h->index)/2 ;i++)
    {
        q = h->data[i];
        h->data[i] = h->data[h->index-i];
        h->data[h->index-i] = q;
    }
    return 0 ; 
  
}

int seqlist_sort(seqlist_t *h)/*从小到大排序*/
{
    for (int i = 0, t=0; i < h->index; i++)              //控制一个共需要多少次排序
    {
        for (int j = 0; j < h->index -i; j++)         //控制每一次冒泡排序需要比较的次数
        {
            if (h->data[j] > h->data[j + 1])                //如果第j 个元素比j+1 元素大，则交换，从小到大的顺序排序
            {
                t = h->data[j];                       //交换 a[j] ,和 a[j+1] 这两个元素
                h->data[j] = h->data[j + 1];
                h->data[j + 1] = t;
            }
        }
    }

    return 0; 
}

int seqlist_show(seqlist_t *h)/*遍历*/
{
    printf("顺序表的内容:");
    for(int i=0;i<=h->index;i++)
    {
        printf("%d ",h->data[i]);  
    }
    printf("\n");
}

int main(int argc, char const *argv[])
{
    seqlist_t * H  = create_empty_seqlist_head(); 
    printf("顺序表的插入:");
    for(int i=0;i<33;i++)
    {       
        if(seqlist_insert(H,i+1) == 0)
        {
            printf("%d ",i+1);
        }
    }
    seqlist_show(H); 

    /*删除*/
    seqlist_delete(H,1); 
    seqlist_delete(H,15); 
    seqlist_delete(H,32); 
    seqlist_show(H); 

    /*修改*/
    seqlist_modify(H,5,55); 
    seqlist_modify(H,2,102);
    seqlist_modify(H,31,131); 
    seqlist_modify(H,10,100); 

    seqlist_show(H);

    /*查找*/
    if (seqlist_search(H,55))
    {
        printf("55 found\n");
    }
    else
    {
        printf("55 not found\n");
    }
    if (seqlist_search(H,31))
    {
        printf("31 found\n");
    }
    else
    {
        printf("31 not found\n");
    }

    /*倒序*/
    seqlist_reverse(H);
    seqlist_show(H);

    /*排序*/
    seqlist_sort(H);
    seqlist_show(H);

    return 0;
}